package com.obelisco.vista.seguridad;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import nextapp.echo2.app.Button;
import nextapp.echo2.app.Color;
import nextapp.echo2.app.Column;
import nextapp.echo2.app.ContentPane;
import nextapp.echo2.app.Font;
import nextapp.echo2.app.ImageReference;
import nextapp.echo2.app.Insets;
import nextapp.echo2.app.ResourceImageReference;
import nextapp.echo2.app.Row;
import nextapp.echo2.app.SplitPane;
import nextapp.echo2.app.TextField;
import nextapp.echo2.app.TextArea;
import nextapp.echo2.extras.app.TabPane;
import nextapp.echo2.extras.app.layout.TabPaneLayoutData;
import nextapp.echo2.app.Grid;
import nextapp.echo2.app.Label;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.layout.GridLayoutData;
import nextapp.echo2.app.layout.RowLayoutData;
import nextapp.echo2.app.layout.SplitPaneLayoutData;
import nextapp.echo2.app.Alignment;

import com.obelisco.modelo.data.CarpetaTransaccion;
import com.obelisco.modelo.data.Grupo;
import com.obelisco.modelo.data.Operacion;
import com.obelisco.modelo.data.Transaccion;
import com.obelisco.modelo.data.Usuario;
import com.obelisco.modelo.servicios.seguridad.IServicioAdministrarCarpetas;
import com.obelisco.modelo.servicios.seguridad.IServicioAdministrarGrupos;
import com.obelisco.modelo.servicios.seguridad.ServicioAdministrarGrupos;
import com.obelisco.vista.componentes.ComponenteDatosListener;
import com.obelisco.vista.componentes.DialogoError;
import com.obelisco.vista.componentes.DobleLista;
import com.obelisco.vista.componentes.TipoFuncion;
import com.obelisco.vista.controles.BindingTextArea;
import com.obelisco.vista.controles.BindingTextField;
import com.obelisco.vista.estilos.Styles;
import com.obelisco.vista.inicio.Aplicacion;
import com.obelisco.vista.seguridad.ArbolSeguridad;

import echopointng.ContainerEx;
import echopointng.ContentPaneEx;

public class PaneGrupo extends ContentPaneEx implements ComponenteDatosListener {

	private BindingTextField txtNombre;

	private BindingTextArea txtDescripcion;

	private DobleLista dblUsuarios;

	private ArbolSeguridad arbolSeguridad;

	private Label lblDescripcion;

	private Label lblNombre;

	private Label lblTipo;

	private Label lblConPermiso;
	
	
	
	private Button btnRevocar;
	
	private Button btnConceder;

	private IServicioAdministrarCarpetas servicioAdministrarCarpetas;

	private IServicioAdministrarGrupos servicioAdministrarGrupos;

	/**
	 * Creates a new <code>PaneGrupo</code>.
	 */
	public PaneGrupo() {
		super();

		// Add design-time configured components.
		initComponents();
	}

	private void accionConceder(ActionEvent e) {
		//TODO Implement.
		grupo.getTransacciones().add((Transaccion) objetoActual);
		arbolSeguridad.setRaiz(raiz);
	}
	private void accionRevocar(ActionEvent e) {
		//TODO Implement.
		grupo.getTransacciones().remove((Transaccion) objetoActual);
		arbolSeguridad.setRaiz(raiz);
	}
	
	/**
	 * Configures initial state of component. WARNING: AUTO-GENERATED METHOD.
	 * Contents will be overwritten.
	 */
	private void initComponents() {

		TabPane tab = new TabPane();
		tab.setStyleName("Obelisco.TabPane");
		add(tab);
		Column paneDatos = new Column();
		TabPaneLayoutData paneDatosLayoutData = new TabPaneLayoutData();
		paneDatosLayoutData.setTitle("Datos Generales");
		paneDatos.setLayoutData(paneDatosLayoutData);
		tab.add(paneDatos);
		Grid grdDatos = new Grid();
		grdDatos.setStyleName("Obelisco.GridPaneDialogo");
		//grdDatos.setStyleName("Obelisco.Grid");
		paneDatos.add(grdDatos);
		Label lblNombre = new Label();
		lblNombre.setText("Nombre");
		grdDatos.add(lblNombre);
		txtNombre = new BindingTextField(250);
		txtNombre.setMaximumLength(50);
		grdDatos.add(txtNombre);
		Label lblDescripcion = new Label();
		lblDescripcion.setText("Descripcion");
		GridLayoutData lblDescripcionLayoutData = new GridLayoutData();
		lblDescripcionLayoutData.setAlignment(new Alignment(Alignment.DEFAULT,
				Alignment.TOP));
		lblDescripcion.setLayoutData(lblDescripcionLayoutData);
		grdDatos.add(lblDescripcion);
		txtDescripcion = new BindingTextArea(300, 100);
		grdDatos.add(txtDescripcion);

		ContentPane paneUsuarios = new ContentPane();
		TabPaneLayoutData paneUsuariosLayoutData = new TabPaneLayoutData();
		paneUsuariosLayoutData.setTitle("Usuarios");
		paneUsuarios.setLayoutData(paneUsuariosLayoutData);
		dblUsuarios = new DobleLista();
		dblUsuarios.setLabelOrigen("Usuarios Disponibles");
		dblUsuarios.setLabelDestino("Usuarios Asignados");
		paneUsuarios.add(dblUsuarios);
		tab.add(paneUsuarios);

		ContentPane panePermisos = new ContentPane();
		TabPaneLayoutData panePermisosLayoutData = new TabPaneLayoutData();
		panePermisosLayoutData.setTitle("Permisos");
		panePermisos.setLayoutData(panePermisosLayoutData);
		tab.add(panePermisos);
		// arbolSeguridad = new ArbolSeguridad();
		// panePermisos.add(arbolSeguridad);

		SplitPane splitPane = new SplitPane();
		splitPane.setOrientation(SplitPane.ORIENTATION_HORIZONTAL_LEFT_RIGHT);
		splitPane.setSeparatorPosition(new Extent(300, Extent.PX));
		ContentPane contentPane3 = new ContentPane();
		splitPane.add(contentPane3);
		SplitPane splitPane1 = new SplitPane();
		splitPane1.setOrientation(SplitPane.ORIENTATION_VERTICAL_BOTTOM_TOP);
		splitPane1.setSeparatorPosition(new Extent(26, Extent.PX));
		contentPane3.add(splitPane1);
		Row row1 = new Row();
		row1.setBackground(new Color(0xFFFFFF));
		row1.setAlignment(new Alignment(Alignment.RIGHT, Alignment.DEFAULT));
		splitPane1.add(row1);
		btnConceder = new Button();
//		ResourceImageReference imageReference1 = new ResourceImageReference(
//				"/com/obelisco/vista/resource/image/icon/general/Icon24Check.gif");
//		btnConceder.setIcon(imageReference1);
		btnConceder.setStyleName("Obelisco.Boton");
		btnConceder.setIcon(Styles.ICON_16_RUN);
		RowLayoutData btnConcederLayoutData = new RowLayoutData();
		btnConcederLayoutData.setInsets(new Insets(new Extent(4, Extent.PX),
				new Extent(2, Extent.PX)));
		btnConceder.setLayoutData(btnConcederLayoutData);
		btnConceder.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				accionConceder(e);
			}
		});
		row1.add(btnConceder);
		btnRevocar = new Button();
//		ResourceImageReference imageReference2 = new ResourceImageReference(
//				"/com/obelisco/vista/resource/image/icon/general/Icon24Stop.gif");
//		btnRevocar.setIcon(imageReference2);
		btnRevocar.setStyleName("Obelisco.Boton");
		btnRevocar.setIcon(Styles.ICON_16_RUNDENY);

		RowLayoutData btnRevocarLayoutData = new RowLayoutData();
		btnRevocarLayoutData.setInsets(new Insets(new Extent(4, Extent.PX),
				new Extent(2, Extent.PX)));
		btnRevocar.setLayoutData(btnRevocarLayoutData);
		btnRevocar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				accionRevocar(e);
			}
		});
		row1.add(btnRevocar);
		arbolSeguridad = new ArbolSeguridad();
		SplitPaneLayoutData arbolSeguridadLayoutData = new SplitPaneLayoutData();
		arbolSeguridadLayoutData.setBackground(new Color(0xFEFAED));
		arbolSeguridad.setLayoutData(arbolSeguridadLayoutData);
		splitPane1.add(arbolSeguridad);
		ContentPane contentPane2 = new ContentPane();
		contentPane2.setBackground(new Color(0xFFFFFF));
		splitPane.add(contentPane2);
		Grid grid1 = new Grid();
		grid1.setBackground(new Color(0xFFFFFF));
		grid1.setStyleName("Obelisco.Grid");
		contentPane2.add(grid1);
		Label label1 = new Label();
		label1.setText("Nombre");
		label1.setFont(new Font(null, Font.BOLD, new Extent(10, Extent.PT)));
		grid1.add(label1);
		this.lblNombre = new Label();
		grid1.add(this.lblNombre);
		Label label2 = new Label();
		label2.setText("Descripcion");
		label2.setFont(new Font(null, Font.BOLD, new Extent(10, Extent.PT)));
		grid1.add(label2);
		this.lblDescripcion = new Label();
		grid1.add(this.lblDescripcion);
		Label label3 = new Label();
		label3.setText("Tipo");
		label3.setFont(new Font(null, Font.BOLD, new Extent(10, Extent.PT)));
		grid1.add(label3);
		lblTipo = new Label();
		grid1.add(lblTipo);
		Label label4 = new Label();
		label4.setText("Con Permiso");
		label4.setFont(new Font(null, Font.BOLD, new Extent(10, Extent.PT)));
		grid1.add(label4);
		lblConPermiso = new Label();
		grid1.add(lblConPermiso);
		
		panePermisos.add(splitPane);

	}

	public void onCancelar() {
		// TODO Auto-generated method stub

	}

	public void onConfirmarCambios(Object objeto, TipoFuncion tipo,
			String nombre) {
		// TODO Auto-generated method stub

		grupo.getUsuarios().clear();
		for (Object asignado : dblUsuarios.getDatosDestino()) {
			grupo.getUsuarios().add((Usuario) asignado);
		}

		servicioAdministrarGrupos.guardarGrupo(grupo);

	}

	public void onConfirmarEliminacion(Object object) {
		// TODO Auto-generated method stub

	}

	public void onConsultar(Object objeto) {
		// TODO Auto-generated method stub
		txtNombre.setEnabled(false);
		txtDescripcion.setEnabled(false);
		
		dblUsuarios.setEnabled(false);
		arbolSeguridad.setEnabled(false);

	}

	public void onCrear() {
		// TODO Auto-generated method stub

	}

	public void onFuncionPersonalizada(Object objeto, TipoFuncion funcion,
			String nombre) {
		// TODO Auto-generated method stub

	}

	public void onIncluir(Object objeto) {
		// TODO Auto-generated method stub
		txtNombre.setEnabled(true);
		txtDescripcion.setEnabled(true);
		
		dblUsuarios.setEnabled(true);
		arbolSeguridad.setEnabled(true);

	}

	private ArbolSeguridadListener eventoArbol = new ArbolSeguridadListener() {

		public void onChangeNode(TreeNodeCustom nodo, Object objeto) {
			// TODO Auto-generated method stub
			if (nodo instanceof TreeNodeTransaccion) {
				TreeNodeTransaccion nodoTran = (TreeNodeTransaccion) nodo;

				Transaccion transaccion = nodoTran.getTransaccion();

				if (grupo.getTransacciones().contains(transaccion)) {
					nodo.setIcono(Styles.ICON_16_RUNOK);
				} else {
					nodo.setIcono(Styles.ICON_16_RUNDENY);
				}

			}

		}

	};
	
	private Object objetoActual;
	
	private EjecutarListener eventoEjecutar = new EjecutarListener() {

		public void onClickCarpeta(CarpetaTransaccion carpeta) {
			// TODO Auto-generated method stub
			lblNombre.setText(carpeta.getRuta());
			lblDescripcion.setText(carpeta.getDescripcion());
			lblTipo.setText("Carpeta");
			
			String conPermiso = "NO Aplica";
			lblConPermiso.setText(conPermiso);
			
			objetoActual = carpeta;
			
			btnConceder.setEnabled(false);
			btnRevocar.setEnabled(false);			

		}

 		public void onClickTransaccion(Transaccion transaccion) {
			// TODO Auto-generated method stub
			lblNombre.setText(transaccion.getNombre());
			lblDescripcion.setText(transaccion.getDescripcion());
			lblTipo.setText("Transaccion");
			
			String conPermiso = "NO";
			if (grupo.getTransacciones().contains(transaccion)) {
				conPermiso = "SI";
			}
			lblConPermiso.setText(conPermiso);
			
			objetoActual = transaccion;
			
			btnConceder.setEnabled(true);
			btnRevocar.setEnabled(true);			

 		}
		
	};
	
	private CarpetaTransaccion raiz;

	public void onInicializar() {
		// TODO Auto-generated method stub
		txtNombre.setBinding(grupo, "nombre");
		txtDescripcion.setBinding(grupo, "descripcion");

		List usuariosDisponibles = servicioAdministrarGrupos
				.buscarUsuariosDisponibles(grupo);
		dblUsuarios.setDatosOrigen(usuariosDisponibles);
		ArrayList lstUsuarios = new ArrayList(grupo.getUsuarios());
		dblUsuarios.setDatosDestino(lstUsuarios);

		raiz = servicioAdministrarCarpetas.buscarArbol();
		arbolSeguridad.addArbolSeguridadListener(eventoArbol);
		arbolSeguridad.addEjecutarListener(eventoEjecutar);
		arbolSeguridad.setRaiz(raiz);
		
	}

	public void onModificar(Object objeto) {
		// TODO Auto-generated method stub
		txtNombre.setEnabled(false);
		txtDescripcion.setEnabled(true);
		dblUsuarios.setEnabled(true);
		arbolSeguridad.setEnabled(true);
	}

	private Grupo grupo;

	public void onObjetoEntidad(Object objeto) {
		// TODO Auto-generated method stub
		this.grupo = (Grupo) objeto;
	}

	public boolean onValidarDatos(Object objeto, TipoFuncion tipo, String nombre) {
		// TODO Auto-generated method stub
		return true;
	}

	public IServicioAdministrarGrupos getServicioAdministrarGrupos() {
		return servicioAdministrarGrupos;
	}

	public void setServicioAdministrarGrupos(
			IServicioAdministrarGrupos servicioAdministrarGrupos) {
		this.servicioAdministrarGrupos = servicioAdministrarGrupos;
	}

	public IServicioAdministrarCarpetas getServicioAdministrarCarpetas() {
		return servicioAdministrarCarpetas;
	}

	public void setServicioAdministrarCarpetas(
			IServicioAdministrarCarpetas servicioAdministrarCarpetas) {
		this.servicioAdministrarCarpetas = servicioAdministrarCarpetas;
	}

	public void onListaParametros(List arg0) {
		// TODO Auto-generated method stub
		
	}
}
